package com.fz.us.admin.base.dao;

import com.fz.us.admin.base.bean.search.Search;
import com.fz.us.admin.base.bean.search.result.SearchResult;
import com.fz.us.admin.base.entity.BaseEntity;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Dao接口 - Dao基接口
 * ============================================================================
 * 版权所有 2016 。
 *
 * @author fallenpanda
 * @version 1.0 2016-07-13 。
 * ============================================================================
 */
public interface BaseDao<T extends BaseEntity, PK extends Serializable> {

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param className
	 *            记录Class
	 * @param id
	 *            记录ID
	 *            
	 * @return 实体对象
	 */
	public Object getObject(String className, PK id);
	
	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 *            
	 * @return 实体对象
	 */
	public T get(PK id);

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 *            
	 * @return 实体对象
	 */
	public T load(PK id);

	/**
	 * 根据ID数组获取实体对象集合.
	 *
	 * @param ids
	 *            ID对象数组
	 *
	 * @return 实体对象集合
	 */
	public List<T> get(PK[] ids);

	/**
	 * 根据属性名和属性值获取实体对象.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 *            
	 * @return 实体对象
	 */
	public T get(String propertyName, Object value);

	/**
	 * 根据属性名、修改前后属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).
	 *
	 * @param propertyName
	 *            属性名称
	 * @param oldValue
	 *            修改前的属性值
	 * @param oldValue
	 *            修改后的属性值
	 *
	 * @return boolean
	 */
	public boolean isUnique(String propertyName, Object oldValue, Object newValue);

	/**
	 * 根据属性名判断数据是否已存在.
	 *
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            值
	 *
	 * @return boolean
	 */
	public boolean isExist(String propertyName, Object value);

	/**
	 * 根据属性名和属性值获取实体对象集合.
	 *
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 *
	 * @return 实体对象集合
	 */
	public List<T> getList(String propertyName, Object value);

	/**
	 * 获取所有实体对象集合.
	 *
	 * @return 实体对象集合
	 */
	public List<T> getAll();

	/**
	 * 获取所有实体对象总数.
	 *
	 * @return 实体对象总数
	 */
	public Long getTotalCount();

	/**
	 * 保存实体对象.
	 * 
	 * @param entity
	 *            对象
	 *            
	 * @return ID
	 */
	public PK save(T entity);

	/**
	 * 更新实体对象.
	 * 
	 * @param entity
	 *            对象
	 */
	public void update(T entity);
	
	/**
	 * 删除实体对象.
	 * 
	 * @param entity
	 *            对象
	 */
	public void delete(T entity);

	/**
	 * 根据ID删除实体对象.
	 * 
	 * @param id
	 *            记录ID
	 */
	public void delete(PK id);

	/**
	 * 根据ID数组删除实体对象.
	 * 
	 * @param ids
	 *            ID数组
	 */
	public void delete(PK[] ids);

	/**
	 * 刷新session.
	 * 
	 */
	public void flush();

	/**
	 * 清除Session.
	 * 
	 */
	public void clear();
	
	/**
	 * 清除某一对象.
	 * 
	 * @param object
	 *            需要清除的对象
	 */
	public void evict(Object object);

	/**
	 * 执行hql语句
	 *
	 * @param hql
	 * 			hql语句
	 *
	 * @return Query
     */
	public Query createQuery(String hql);

	/**
	 * 执行sql语句
	 *
	 * @param sql
	 * 			sql语句
	 *
	 * @return SQLQuery
	 */
	public SQLQuery createSqlQuery(String sql);

	/**
	 * 得到唯一结果
	 * @param hql
	 *            hql
	 *
	 * @return Object
	 */
	public Object getUniqueResult(String hql);

	/**
	 * 得到所有清单
	 * @param hql
	 *            hql
	 *
	 * @return List集合
	 */
	public List<T> getList(String hql);

	/**
	 * 得到唯一结果
	 * @param hql
	 *            hql
	 *
	 * @return Object
	 */
	public Object getUniqueResult(String hql, Map<String, Object> params);

	/**
	 * 得到所有清单
	 * @param hql
	 *            hql
	 * @param params
	 * 			   参数
	 *
	 * @return List集合
	 */
	public List<T> getList(String hql, Map<String, Object> params);

	/**
	 * 得到所有清单
	 * @param hql
	 *            hql
	 * @param params
	 * 			   参数
	 *
	 * @return List集合
	 */
	public List<Object[]> getObjectsList(String hql, Map<String, Object> params);

	/**
	 * 得到所有清单
	 * @param hql
	 *            hql
	 * @param params
	 * 			   参数
	 *
	 * @return List集合
	 */
	public List<Map<String, Object>> getMapList(String hql, Map<String, Object> params);

	/**
	 * 根据 Search 对象进行查询(提供分页、条件查找、排序功能).
	 *
	 * @param search
	 *            Search 对象
	 *
	 * @return Search 对象
	 */
	public SearchResult findBySearch(Search search);

	/**
	 * 根据文档id和实体类名来获得实体读写
	 * @param keyId
	 * @param className
	 * @return
	 */
	public Object getObjectEntity(String keyId, String className);



}